package hzip;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Writes to HZIPOutputStream are compressed and sent to the output stream being
 * wrapped. No writing is actually done until close.
 */
public class HZIPOutputStream extends OutputStream {
	public HZIPOutputStream(OutputStream out) throws IOException {
		dout = new DataOutputStream(out);
	}

	public void write(int ch) throws IOException {
		byteOut.write(ch);
	}

	public void close() throws IOException {
		byte[] theInput = byteOut.toByteArray();
		ByteArrayInputStream byteIn = new ByteArrayInputStream(theInput);

		CharCounter countObj = new CharCounter(byteIn);
		byteIn.close();

		HuffmanTree codeTree = new HuffmanTree(countObj);
		codeTree.writeEncodingTable(dout);

		BitOutputStream bout = new BitOutputStream(dout);

		for (int i = 0; i < theInput.length; i++)
			bout.writeBits(codeTree.getCode(theInput[i] & (0xff)));
		bout.writeBits(codeTree.getCode(BitUtils.EOF));

		bout.close();
		byteOut.close();
	}

	private ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
	private DataOutputStream dout;
}
